#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>         // 包含task_struct的定义
#include <linux/sched/signal.h>  // 包含信号处理和进程遍历

/**
 * @brief 内核模块初始化函数
 * 
 * 模块加载时调用此函数，遍历系统中的所有进程并打印其名称。
 * 
 * @return int 成功返回0
 */
static int __init list_process_names_init(void)
{
    struct task_struct *task;   ///< 用于存储当前遍历到的进程任务
    struct list_head *pos;      ///< 链表指针用于遍历任务列表

    printk(KERN_INFO "Listing all process names using init_task:\n");

    // 从init_task开始，遍历任务链表
    list_for_each(pos, &init_task.tasks) {
        // 使用list_entry宏获取当前list_head对应的task_struct
        task = list_entry(pos, struct task_struct, tasks);
        // 打印当前进程的名称
        printk(KERN_INFO "Process: %s\n", task->comm);
    }

    return 0; ///< 返回初始化成功
}

/**
 * @brief 内核模块清理函数
 * 
 * 模块卸载时调用此函数，打印退出日志信息。
 */
static void __exit list_process_names_exit(void)
{
    printk(KERN_INFO "Process names module exited.\n"); ///< 打印模块卸载信息
}

module_init(list_process_names_init); ///< 指定模块初始化函数
module_exit(list_process_names_exit); ///< 指定模块退出函数

MODULE_LICENSE("GPL"); ///< 指定模块许可证为GPL
MODULE_DESCRIPTION("List all process names using init_task"); ///< 模块描述
MODULE_AUTHOR("Zhenxiong Chen"); ///< 模块作者
